package language;

/**
 * This class is to convert from ascii to utf 8 Author from
 * http://www.thoughtsabout.net/blog/archives/000044.html
 */
import java.io.UnsupportedEncodingException;
import java.util.Enumeration;
import java.util.Locale;
import java.util.PropertyResourceBundle;
import java.util.ResourceBundle;

public abstract class Utf8ResourceBundle
{
   private static class Utf8PropertyResourceBundle extends ResourceBundle
   {
      PropertyResourceBundle bundle;

      private Utf8PropertyResourceBundle(PropertyResourceBundle bundle)
      {
         this.bundle = bundle;
      }

      /*
       * (non-Javadoc)
       * @see java.util.ResourceBundle#getKeys()
       */
      @Override
      @SuppressWarnings({ "rawtypes", "unchecked" })
      public Enumeration getKeys()
      {
         return bundle.getKeys();
      }

      /*
       * (non-Javadoc)
       * @see java.util.ResourceBundle#handleGetObject(java.lang.String)
       */
      @Override
      protected Object handleGetObject(String key)
      {
         String value = (String) bundle.handleGetObject(key);
         try
         {
            return new String(value.getBytes("ISO-8859-1"), "UTF-8");
         }
         catch (UnsupportedEncodingException e)
         {
            // Shouldn't fail - but should we still add logging message?
            return null;
         }
         catch (Exception e)
         {
            // TODO: handle exception
            return null;
         }
      }

   }

   private static ResourceBundle createUtf8PropertyResourceBundle(
         ResourceBundle bundle)
   {
      if (!(bundle instanceof PropertyResourceBundle))
         return bundle;

      return new Utf8PropertyResourceBundle((PropertyResourceBundle) bundle);
   }

   /**
    * This method make string into Resource bundle int utf8
    * 
    * @param baseName
    *            any string that want to convert to utf8
    * @return resourceburble in uft8 format
    */
   public static final ResourceBundle getBundle(String baseName)
   {
      ResourceBundle bundle = ResourceBundle.getBundle(baseName);
      return createUtf8PropertyResourceBundle(bundle);
   }

   public static final ResourceBundle getBundle(String baseName, Locale locale)
   {
      ResourceBundle bundle = ResourceBundle.getBundle(baseName, locale);
      return createUtf8PropertyResourceBundle(bundle);
   }

   public static ResourceBundle getBundle(String baseName, Locale locale,
         ClassLoader loader)
   {
      ResourceBundle bundle = ResourceBundle.getBundle(baseName, locale);
      return createUtf8PropertyResourceBundle(bundle);
   }
}
